import request from "@/utils/request";
import store from "@/store/index";
import router from "@/router/index";

/**
 * 登录
 * @param data
 * @returns {Promise<unknown>}
 */
export const login = (data) => {
    return request({
        method: 'post',
        url: '/api/x-work/login_work',
        data: data // 直接使用传入的 data 对象
    }).catch(error => {
        console.error('登录请求出错:', error);
        throw error; // 抛出错误，让调用者可以处理
    });
}

/**
 * 用户信息
 * @param data
 * @returns {Promise<unknown>}
 */
export const getUserInfo = () => {
    return request({
        method: 'get',
        url: '/api/x-work/work_info',
        /*headers:{
             //.?
             Authorization:store.state?.tokenInfo
        }*/
    }).catch(error => {
        console.error('登录请求出错:', error);
        throw error;
    });
}


//用户退出
export const logout = () => {
    return request({
        method: 'POST',
        url: '/api/x-work/login_out_work'
    })
}

/**
 * 假设存在多个请求同时因为令牌过期而触发了 refreshToken 函数：
 * 第一个请求进入 refreshToken 函数，此时 refreshing 为 false，所以会将 refreshing 设为 true，然后发起刷新 token 的请求。
 * 第二个请求在第一个请求还未完成刷新操作时也进入了 refreshToken 函数，这时 refreshing 为 true，所以第二个请求会直接返回第一个请求保存的 promiseRT，不会再次发起刷新请求。
 * 当第一个请求的刷新操作完成后，finally 块会把 refreshing 重置为 false，后续再有请求触发 refreshToken 函数时，就可以重新发起刷新请求
 */
//刷新token,不多次产生不同的promise对象
//解决同一时刻请求多次使用
let promiseRT = null //保存请求刷新token的promise对象
let refreshing = false //标识是否已经启动了刷新动作
export const refreshToken = () => {
    if (refreshing) {
        return promiseRT;
    }
    refreshing = true
    promiseRT = request({
        method: 'POST',
        url: '/api/work/refresh_token',
        params: {
            refreshToken: store.state.tokenInfo
        }
    }).then(res => {
        // debugger
        if (res.data.code == 200) {
            //刷新token成功,保存新的tokenInfo
            store.commit('saveTokenInfo', res.data.data)
        } else {
            //刷新token失败,跳转到登录,返回错误状态
            //query: {redirect: router.currentRoute.fullPath}之前的位置,登录成功可以跳转回去,先保存
            router.push({name: 'login', query: {redirect: router.currentRoute.fullPath}})
            //形成promise对象的失败状态
            throw new Error('刷新token失败!')
        }
    }).finally(() => {
        refreshing = false
    })
    return promiseRT;
}


